/**
 * 自定义存储引擎
 * 优化 Redux Persist 的序列化，减少转义字符，提高可读性
 */

import { STORAGE_PREFIX } from '@/constants/storage'

/**
 * 格式化 JSON 字符串，使其更易读
 * @param obj 要序列化的对象
 * @returns 格式化后的 JSON 字符串
 */
const formatJSON = (obj: any): string => {
  try {
    // 使用 2 个空格缩进，使存储的数据更易读
    return JSON.stringify(obj, null, 2)
  } catch (error) {
    // 静默降级为默认序列化，避免控制台噪音
    return JSON.stringify(obj)
  }
}

/**
 * 解析 JSON 字符串
 * @param str JSON 字符串
 * @returns 解析后的对象
 */
const parseJSON = (str: string): any => {
  try {
    return JSON.parse(str)
  } catch (error) {
    // 解析失败时返回 null，避免 console 输出
    return null
  }
}

/**
 * 自定义存储引擎
 * 提供更好的序列化格式，减少转义字符
 */
export const customStorage = {
  /**
   * 获取存储项
   * @param key 存储键
   * @returns Promise<string | null>
   */
  getItem: async (key: string): Promise<string | null> => {
    try {
      const item = localStorage.getItem(key)
      if (item === null) return null
      
      // 如果存储的是对象，直接返回格式化的字符串
      const parsed = parseJSON(item)
      if (parsed && typeof parsed === 'object') {
        return formatJSON(parsed)
      }
      
      return item
    } catch (error) {
      // 读取异常时静默返回 null，避免控制台噪音
      return null
    }
  },

  /**
   * 设置存储项
   * @param key 存储键
   * @param value 存储值
   * @returns Promise<void>
   */
  setItem: async (key: string, value: string): Promise<void> => {
    try {
      // 尝试解析值，如果是有效的 JSON，则格式化存储
      const parsed = parseJSON(value)
      if (parsed && typeof parsed === 'object') {
        localStorage.setItem(key, formatJSON(parsed))
      } else {
        localStorage.setItem(key, value)
      }
    } catch (error) {
      // 设置异常时静默降级为直接存储
      localStorage.setItem(key, value)
    }
  },

  /**
   * 移除存储项
   * @param key 存储键
   * @returns Promise<void>
   */
  removeItem: async (key: string): Promise<void> => {
    try {
      localStorage.removeItem(key)
    } catch (error) {
      // 移除异常时静默处理
    }
  }
}

/**
 * 简化版存储引擎（不格式化，减少性能开销）
 * 直接使用原生 localStorage，但提供统一的异步接口
 */
export const simpleStorage = {
  getItem: async (key: string): Promise<string | null> => {
    return localStorage.getItem(key)
  },
  
  setItem: async (key: string, value: string): Promise<void> => {
    localStorage.setItem(key, value)
  },
  
  removeItem: async (key: string): Promise<void> => {
    localStorage.removeItem(key)
  }
}

/**
 * 开发环境存储引擎
 * 在开发环境使用格式化存储，生产环境使用简化存储
 */
export const adaptiveStorage = process.env.NODE_ENV === 'development' 
  ? customStorage 
  : simpleStorage

// 默认导出适应性存储
export default adaptiveStorage
